﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;
using FrameworkLib.Facades.Paging;
using LinqKit;
using System.Linq.Expressions;
using FrameworkLib.Filters;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class ComposizioneColorePageFacadeExt : PagedFacadeBase<GestionePolveriEntities>
    {
        public ComposizioneColorePageFacadeExt(int pageSize)
            : base(pageSize)
        {

        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetAll(), callback);
        }

        public List<ComposizioneColore> GetAll()
        {
            List<ComposizioneColore> retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();
                var obj = (from x in context.ComposizioneColori
                           orderby x.IDComposizione ascending
                           select new ComposizioneColore
                           {
                               ID = x.IDComposizione,
                               Colore = (from y in context.AnagColori
                                         where y.IDColore == x.IDColore
                                         select new Colore
                                         {
                                             ID = y.IDColore,
                                             CodiceColore = y.CodiceColore,
                                             Descrizione = y.Descrizione,
                                             Famiglia = (from f in context.AnagFamiglie
                                                         where f.IDFamiglia == y.IDFamiglia
                                                         select new FamigliaColore
                                                         {
                                                             ID = f.IDFamiglia,
                                                             Descrizione = f.Descrizione
                                                         }).FirstOrDefault()
                                         }).FirstOrDefault(),
                               Polvere = (from y in context.AnagPolveri
                                          where y.IDPolvere == x.IDPolvere
                                          select new Polvere {
                                              ID = y.IDPolvere,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault(),
                               FornitoreDesc = (from f in context.AnagFornitori
                                                           join p in context.AnagPolveri on f.IDFornitore equals p.IDFornitore
                                                           where p.IDPolvere == x.IDPolvere 
                                                           select f.Descrizione).FirstOrDefault(),
                               //Polveri = (from z in context.AnagPolveri
                               //           where z.IDPolvere == x.IDPolvere
                               //           select new PolvereExt
                               //           {
                               //               Descrizione = z.Descrizione
                               //           }),
                               Applicazione = x.Applicazione
                           }).Skip(base.Skip).Take(base.PageSize);

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<ComposizioneColore> GetAll(FilterBase<ComposizioneColori> filter)
        {
            List<ComposizioneColore> retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();

                var obj = (from x in context.ComposizioneColori.AsExpandable().Where(filter.SetUpFilter())
                           orderby x.IDComposizione ascending
                           select new ComposizioneColore
                           {
                               ID = x.IDComposizione,
                               Colore = (from y in context.AnagColori
                                         where y.IDColore == x.IDColore
                                         select new Colore
                                         {
                                             ID = y.IDColore,
                                             CodiceColore = y.CodiceColore,
                                             Descrizione = y.Descrizione,
                                             Famiglia = (from f in context.AnagFamiglie
                                                         where f.IDFamiglia == y.IDFamiglia
                                                         select new FamigliaColore
                                                         {
                                                             ID = f.IDFamiglia,
                                                             Descrizione = f.Descrizione
                                                         }).FirstOrDefault()
                                         }).FirstOrDefault(),
                               //Polveri = (from z in context.AnagPolveri
                               //           where z.IDPolvere == x.IDPolvere
                               //           select new PolvereExt
                               //           {
                               //               Descrizione = z.Descrizione
                               //           }),
                               Applicazione = x.Applicazione
                           }).Skip(base.Skip).Take(base.PageSize);

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public void GetNumberOfPages()
        {
            this.CalcNumberOfPages((from x in this.GetContext().ComposizioneColori select x).Count());
        }

        public void GetNumberOfPages(FilterBase<ComposizioneColori> filter)
        {
            Expression<Func<ComposizioneColori, bool>> theFilter = filter.SetUpFilter();
            this.CalcNumberOfPages((from x in this.GetContext().ComposizioneColori.AsExpandable().Where(theFilter) select x).Count());
        }

        public List<ComposizioneColoreExt> GetByColore(int idColore)
        {
            List<ComposizioneColoreExt> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.ComposizioneColori
                      where x.IDColore == idColore
                      select new ComposizioneColoreExt
                      {
                          ID = x.IDComposizione
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<ComposizioneColoreExt> GetByPolvere(int idPolvere)
        {
            List<ComposizioneColoreExt> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.ComposizioneColori
                      where x.IDPolvere == idPolvere
                      select new ComposizioneColoreExt
                      {
                          ID = x.IDComposizione
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Colore> GetColoriAssociati(int polvereId)
        {
            List<Colore> retValue = null;

            try
            {
                this.Transact(() => { });

                GestionePolveriEntities context = this.GetContext();
                var obj = (from x in context.ComposizioneColori
                          where x.IDPolvere == polvereId
                          select new Colore
                          {
                              ID = x.AnagColori.IDColore,
                              CodiceColore = x.AnagColori.CodiceColore,
                              Applicazione = x.AnagColori.ComposizioneColori.FirstOrDefault().Applicazione,
                              Famiglia = (from y in context.AnagFamiglie
                                          where y.IDFamiglia == x.AnagColori.IDFamiglia
                                          select new FamigliaColore
                                          {
                                              ID = y.IDFamiglia,
                                              Descrizione = y.Descrizione
                                          }).FirstOrDefault()
                          });

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }

            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public string GetColoriAssociati2(int polvereId)
        {
            string retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();
                var obj = from x in context.ComposizioneColori
                          where x.IDPolvere == polvereId
                          select new Colore
                          {
                              CodiceColore = x.AnagColori.CodiceColore,
                              Applicazione = x.Applicazione
                          };

                if (obj.Any())
                {
                    foreach (Colore c in obj.ToList())
                    {
                        retValue += string.Format("[{0}/{1}] ", c.CodiceColore, c.Applicazione);
                    }
                }

            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<PolvereExt> GetPolveriAssociate(int coloreId)
        {
            List<PolvereExt> retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();
                var obj = from x in context.ComposizioneColori
                          where x.IDColore == coloreId
                          select new PolvereExt
                          {
                              ID = x.AnagPolveri.IDPolvere,
                              CodicePolvere = x.AnagPolveri.CodicePolvere,
                              Base = (x.Applicazione == "b" ? true: (x.Applicazione == "bv" ? true : false)),
                              Venatura = (x.Applicazione == "v" ? true : (x.Applicazione == "bv" ? true : false))
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public string GetApplicazioneColore(int idColore)
        {
            string retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();
                var obj = from x in context.ComposizioneColori
                          where x.IDColore == idColore
                          select x.Applicazione;

                if (obj.Any())
                {
                    foreach (string a in obj)
                    {
                        retValue += a + ",";
                    }

                    retValue = retValue.Substring(0, retValue.LastIndexOf(","));
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public string GetFamiglieColoriAssociate(int polvereId)
        {
            string retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();
                var obj = from x in context.ComposizioneColori
                          where x.IDPolvere == polvereId
                          select x.AnagColori.AnagFamiglie.Descrizione;

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }
    }
}
